package serveur;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;

public class Joueur implements Comparable<Joueur>{

	private ArrayList<Navire> navires;
	private String nom;
	private Socket socket;		
	private BufferedReader in;
	private DataOutputStream out;

	private int numPartie;
	private int nbPasDrone;
	private Thread placerNavires;
	private int ordrePsg;
	private int droneX;
	private int droneY;
	private boolean perdant;
	
	Joueur( Socket socket,
			BufferedReader in, 
			DataOutputStream out,
			String nom, int numPartie) throws IOException{
		this.socket = socket;
		socket.setSoTimeout(100000);
		ordrePsg =-1;
		navires = new ArrayList<Navire>();
		navires.add(
				new Navire(-1, -1, -1, -1, 
						EnumNavire.SOUSMARIN1.getLongueur()));
		navires.add(
				new Navire(-1, -1, -1, -1, 
						EnumNavire.SOUSMARIN2.getLongueur()));
		/*
		navires.add(
				new Navire(-1, -1, -1, -1, 
						EnumNavire.TORPILLEUR1.getLongueur()));
		navires.add(
				new Navire(-1, -1, -1, -1, 
						EnumNavire.TORPILLEUR2.getLongueur()));
		navires.add(
				new Navire(-1, -1, -1, -1, 
						EnumNavire.DESTROYER1.getLongueur()));
		navires.add(
				new Navire(-1, -1, -1, -1, 
						EnumNavire.DESTROYER2.getLongueur()));
		navires.add(
				new Navire(-1, -1, -1, -1, 
						EnumNavire.CROISEUR.getLongueur()));
						*/
		this.nom = nom;
		this.numPartie = numPartie;
		this.in = in;
		this.out = out;
		nbPasDrone = 1;
		droneX = 0;
		droneY = 0;
		perdant = false;
		placerNavires = null;
	}

	protected void initPlacerNavires(){
		placerNavires = new Thread(new PlacerNavires(this));
	}
	
	/**
	 * @return the numPartie
	 */
	protected int getNumPartie() {
		return numPartie;
	}

	/**
	 * @param numPartie the numPartie to set
	 */
	protected void setNumPartie(int numPartie) {
		this.numPartie = numPartie;
	}

	/**
	 * @return the estPerdant
	 */
	protected boolean isPerdant() {
		return perdant;
	}

	/**
	 * @param estPerdant the estPerdant to set
	 */
	protected void setPerdant(boolean perdant) {
		this.perdant = perdant;
	}

	boolean aPerdu(){
		int coule = 0;
		for(Navire n : navires){
			if(n.estCoule()){
				coule++;
			}
		}
		if(coule == navires.size()){
			return true;
		}
		return false;
	}
	
	boolean estTouche(int x, int y){
		boolean estTouche = false;
		
		for(Navire n : navires){
		
			if(n.positionContainsPoint(x, y)){
				boolean [] navire = n.getEstTouche();
				int morceauNav;
				
				if(x==n.getxA()){
					morceauNav = y-n.getyA();
				}else{
					morceauNav = x-n.getxA();
				}
				
				if(!navire[morceauNav]) {
					n.setNavireTouche(x, y);
					estTouche =true;
				}
			}
		}
		
		return estTouche;
	}

	protected void interromprePlacement(){
		placerNavires.interrupt();
	}
	
	protected void sendMessage(String msg) 
			throws IOException{
		out.write(msg.getBytes());
		out.flush();
		System.out.println("JOUEUR "+this.getOrdrePsg()+
				" "+this.getNom()+"\t recoie du serveur \t"+msg);
	}
	
	protected String receiveMessage() throws IOException{
		String ans = in.readLine();
		System.out.println("JOUEUR "+this.getOrdrePsg()+
				" "+this.getNom()+"\t envoie au serveur \t"+ans);
		return ans;

	}

	protected void resetOrdre(){
		this.ordrePsg = -1;
	}
	
	protected ArrayList<Navire> getNavires(){
		return navires;
	}

	
	protected void close() throws IOException{
		in.close();
		out.close();
		socket.close();
	}
	
	protected void resetNavires(){
		for(Navire n: navires){
			n.setxA(-1);
			n.setxB(-1);
			n.setyA(-1);
			n.setyB(-1);
			n.setEstTouche(new boolean[n.getLongueur()]);
		}
	}
	

	protected String getNom(){
		return nom;
	}

	public Socket getSocket() {
		return socket;
	}

	protected void setSocket(Socket socket) {
		this.socket = socket;
	}

	public BufferedReader getIn() {
		return in;
	}

	protected void setIn(BufferedReader in) {
		this.in = in;
	}

	public DataOutputStream getOut() {
		return out;
	}

	protected void setOut(DataOutputStream out) {
		this.out = out;
	}

	public int getNbPasDrone() {
		return nbPasDrone;
	}

	protected void setNbPasDrone(int nbPasDrone) {
		this.nbPasDrone = nbPasDrone;
	}


	/**
	 * @return the thread placerNavires of Joueur
	 */
	 public Thread getPlacerNavires() {
		 return placerNavires;
	 }



	protected void setOrdrePsg(int ordre) {
		this.ordrePsg=ordre;
	}



	public int getOrdrePsg() {
		return ordrePsg;
	}


	@Override
	public int compareTo(Joueur arg0) {
		return this.ordrePsg - arg0.getOrdrePsg();
	}



	/**
	 * @return the droneX
	 */
	public int getDroneX() {
		return droneX;
	}


	/**
	 * @param droneX the droneX to set
	 */
	protected void setDroneX(int droneX) {
		this.droneX = droneX;
	}


	/**
	 * @return the droneY
	 */
	public int getDroneY() {
		return droneY;
	}


	/**
	 * @param droneY the droneY to set
	 */
	protected void setDroneY(int droneY) {
		this.droneY = droneY;
	}

}